<?php
if (!defined('VALIDADMIN')) die ('Access Denied.');

/* 插件的基本信息 */
if (isset($set_plugins) && $set_plugins == TRUE)
{
	/**
	 *
	 * 插件的基本信息
	 * @var unknown_type
	 */
	$plugin=array(
	title=>'支付宝',
	name=>'alipay',
	author=>'kwor',
	desc=>'支付插件-支付宝',
	admin=>'admin',
	type=>'payment'
	);
}else {
	class alipay{
		//参数是pluginManager的引用
		function __construct(&$pluginManager){
			//$mehod=array('admin','adminin','show');
			$mehod=get_class_methods(get_class());//注册该类所有方法
			foreach ($mehod as $value) {
				$pluginManager->register(get_class(),$this,$value);
			}
		}




		function admin() {
			$sql="select parm from sn_plugins where name = '".get_class()."'";
			$res=$GLOBALS[db]->getrow($sql);

			$jres=json_decode($res['parm'],true);//将json格式转换为数组
			//print_r($jres) ;

			$strcof='<form name="form1" method="post" action="">';

			$strcof.='<lable>商户ID：</lable><input name="partner" type="text"
			size="50"  value="'.$jres['partner'].'" id="partner" /><br/><br/>';

			$strcof.='<lable>邮&nbsp;&nbsp;&nbsp;&nbsp;件：</lable><input name="seller_email" type="text"
			size="50"  value="'.$jres['seller_email'].'" id="email" /><br/><br/>';

			$strcof.='<lable> 效验码：</lable><input name="key" type="text"
			size="50"  value="'.$jres['key'].'" id="key" /><br/><br/>';

			$strcof.='<lable> 类&nbsp;&nbsp;&nbsp;&nbsp;型：</lable>
			 <select name="payment_type">';
			if($jres['payment_type']==0){
				$strcof.='<option value="0" selected>使用标准双接口</option>
			 	<option value="1">使用即时到帐交易接口</option>
			 <option value="2">使用担保交易接口</option>';
			}elseif($jres['payment_type']==1){
				$strcof.='<option value="0">使用标准双接口</option>
			<option value="1" selected>使用即时到帐交易接口</option>
			 <option value="2">使用担保交易接口</option>';
			}elseif($jres['payment_type']==2){
				$strcof.='<option value="0">使用标准双接口</option>
			 	<option value="1">使用即时到帐交易接口</option>
			 <option value="2" selected>使用担保交易接口</option>';
			}
			$strcof.='</select><br/><br/>';

			$strcof.='<input type="hidden" name="action" value="admin" />';
			$strcof.='<input type="hidden" name="admindo" value="adminin" />';
			$strcof.='<input type="submit" name="Submit" value=" 确定 " />';
			$strcof.='</form>';
			return $strcof;

		}

		function adminin($date) {
			$plus=array();
			$plus['partner']=$_REQUEST['partner'];
			$plus['seller_email']=$_REQUEST['seller_email'];
			$plus['key']=$_REQUEST['key'];
			$plus['payment_type']=$_REQUEST['payment_type'];
			$sql="update sn_plugins set parm='".json_encode($plus)."' where name = '".get_class()."'";
			$res=$GLOBALS[db]->query($sql);
			if($res){
				echo '<script type="text/javascript">window.history.go(-1);</script>';
			}else{
				return  '设置失败';
			}

		}


		/**生成签名结果
		 *$array要加密的数组
		 *return 签名结果字符串
		 */
		function build_mysign($sort_array,$security_code,$sign_type = "MD5") {
			$prestr = $this->create_linkstring($sort_array);     	//把数组所有元素，按照“参数=参数值”的模式用“&”字符拼接成字符串
			$prestr = $prestr.$security_code;				//把拼接后的字符串再与安全校验码直接连接起来
			$mysgin = $this->sign($prestr,$sign_type);			    //把最终的字符串加密，获得签名结果
			return $mysgin;
		}



		/**把数组所有元素，按照“参数=参数值”的模式用“&”字符拼接成字符串
		 *$array 需要拼接的数组
		 *return 拼接完成以后的字符串
		 */
		function create_linkstring($array) {
			$arg  = "";
			while (list ($key, $val) = each ($array)) {
				$arg.=$key."=".$val."&";
			}
			$arg = substr($arg,0,count($arg)-2);		     //去掉最后一个&字符
			return $arg;
		}



		/**加密字符串
		 *$prestr 需要加密的字符串
		 *return 加密结果
		 */
		function sign($prestr,$sign_type) {
			$sign='';
			if($sign_type == 'MD5') {
				$sign = md5($prestr);
			}elseif($sign_type =='DSA') {
				//DSA 签名方法待后续开发
				die("DSA 签名方法待后续开发，请先使用MD5签名方式");
			}else {
				die("支付宝暂不支持".$sign_type."类型的签名方式");
			}
			return $sign;
		}


		/**除去数组中的空值和签名参数
		 *$parameter 加密参数组
		 *return 去掉空值与签名参数后的新加密参数组
		 */
		function para_filter($parameter) {
			$para = array();
			while (list ($key, $val) = each ($parameter)) {
				if($key == "sign" || $key == "sign_type" || $val == "")continue;
				else	$para[$key] = $parameter[$key];
			}
			return $para;
		}



		/**对数组排序
		 *$array 排序前的数组
		 *return 排序后的数组
		 */
		function arg_sort($array) {
			ksort($array);
			reset($array);
			return $array;
		}

		function show($date) {

			$sql="select parm from sn_plugins where name = '".get_class()."'";
			$res=$GLOBALS[db]->getrow($sql);
			$jres=json_decode($res['parm'],true);//将json格式转换为数组



			//构造要请求的参数数组
			$parameterarr = array(
        "service"         => "create_direct_pay_by_user",	//接口名称，不需要修改
        "payment_type"    => $jres['payment_type'],               			//交易类型，不需要修改
        "partner"         => $jres['partner'],
        "seller_email"    => $jres['seller_email'],
        "return_url"      => 'http://localhost/xueniao/modules/tuan/payreturn_url.php',
  //      "notify_url"      => 'http://localhost/xueniao/modules/tuan/notift.php',
        "_input_charset"  => "utf-8",
        "show_url"        => 'http://www.bi7.cn',//商品展示页面

			//从订单数据中动态获取到的必填参数
        "out_trade_no"    => $date['out_trade_no'],
        "subject"         => $date['subject'],
        "body"            => $date['body'],
        "total_fee"       => $date['total_fee'],
		"sign_type"=>"MD5",

			//扩展功能参数——网银提前
			//   "paymethod"	      => $paymethod,
			//"defaultbank"	  => $defaultbank,

			//扩展功能参数——防钓鱼
			//"anti_phishing_key"=> $encrypt_key,
			//"exter_invoke_ip"  => $exter_invoke_ip,

			//扩展功能参数——分润(若要使用，请取消下面两行注释)
			//"royalty_type"   => "10",	  //提成类型，不需要修改
			//"royalty_parameters" => "111@126.com^0.01^分润备注一|222@126.com^0.01^分润备注二",
			/*提成信息集，与需要结合商户网站自身情况动态获取每笔交易的各分润收款账号、各分润金额、各分润说明。最多只能设置10条
			 提成信息集格式为：收款方Email_1^金额1^备注1|收款方Email_2^金额2^备注2
			 */

			//扩展功能参数——自定义超时(若要使用，请取消下面一行注释)。该功能默认不开通，需联系客户经理咨询
			//"it_b_pay"	    => "1c",	  //超时时间，不填默认是15天。八个值可选：1h(1小时),2h(2小时),3h(3小时),1d(1天),3d(3天),7d(7天),15d(15天),1c(当天)

			//扩展功能参数——自定义参数
			//"buyer_email"	    => $buyer_email,
			//"extra_common_param" => $extra_common_param
			);


			$parameter      =$this->para_filter($parameterarr);
			$security_code=$jres['key'];
			$sort_array   = $this->arg_sort($parameter);    //得到从字母a到z排序后的加密参数数组



			$plustr='<INPUT class=input type=radio CHECKED value=alipay name=paytype>
	         <LABEL class="alipay label" >推荐淘宝用户使用</LABEL>';
			$plustr.='<FORM id="alipay" action=https://www.alipay.com/cooperate/gateway.do?_input_charset='.$parameterarr['_input_charset'].' method=post target=_blank>';
			$plustr.='<INPUT type=hidden value='.$parameterarr['_input_charset'].' name=_input_charset>';

			$plustr.='<INPUT type=hidden value='.$parameterarr['payment_type'].' name=payment_type>';
			$plustr.='<INPUT type=hidden value='.$parameterarr['sign_type'].' name=sign_type>';
			$plustr.='<INPUT type=hidden value='.$this->build_mysign($sort_array,$security_code,"MD5").' name=sign>';

			$plustr.='<input type="hidden" name="body" value="'.$parameterarr['body'].'" />';
//			$plustr.='<INPUT type=hidden value="'.$parameterarr['notify_url'].'" name=notify_url>';

			$plustr.='<INPUT type=hidden value="'.$parameterarr['out_trade_no'].'" name=out_trade_no>';//订单号（唯一）

			$plustr.='<INPUT type=hidden value="'.$parameterarr['partner'].'" name=partner>';
		 //	$plustr.='<INPUT type=hidden value='.$paymethod.' name=paymethod>';
			$plustr.='<INPUT type=hidden value="'.$parameterarr['return_url'].'" name=return_url>';
			$plustr.='<INPUT type=hidden value="'.$parameterarr['seller_email'].'" name=seller_email>';
			$plustr.='<INPUT type=hidden value='.$parameterarr['service'].' name=service>';
			$plustr.='<INPUT type=hidden value="'.$parameterarr['show_url'].'" name=show_url>';
			$plustr.='<INPUT type=hidden value="'.$parameterarr['subject'].'" name=subject>';
			$plustr.='<INPUT type=hidden value="'.$parameterarr['total_fee'].'" name=total_fee>';

			$plustr.='</FORM>';
			return  $plustr;

		}

		//验证信息功能
		function return_verify($date) {

			$sql="select parm from sn_plugins where name = '".get_class()."'";
			$res=$GLOBALS[db]->getrow($sql);
			$jres=json_decode($res['parm'],true);//将json格式转换为数组


			$security_code=$jres['key'];
			$sign_type="MD5";
			$gateway = "https://www.alipay.com/cooperate/gateway.do?";

			$parmarr=array(
			"payment_type"    => $jres['payment_type'],               			//交易类型，不需要修改
             "partner"         => $jres['partner'],
             "seller_email"    => $jres['seller_email']
			);

			$notify_id=$date['notify_id'];
			$sign=$date['sign'];
				

			//echo $mysign."<br/>";
			//print_r($sort_get) ;
				
			if($transport == "https") {
				$veryfy_url = $gateway. "service=notify_verify" ."&partner=" .$partner. "&notify_id=".$notify_id;
			} else {
				$veryfy_url = $gateway. "partner=".$partner."&notify_id=".$notify_id;
			}
			$veryfy_result = $veryfy_url;




			if(!empty($_GET)) {
				$get= $this->para_filter($_GET);
			}
				
			$sort_get     = $this->arg_sort($get);

			$mysign  = $this->build_mysign($sort_get,$security_code,$sign_type);   //生成签名结
				
			//	return $veryfy_result;
				
			//写日志记录
			//	$this->log_result("veryfy_result=".$veryfy_result."\n notify_url_log:sign=".$sign."&mysign=".$mysign.",".$this->create_linkstring($sort_get));

			//判断veryfy_result是否为ture，生成的签名结果mysign与获得的签名结果sign是否一致
			//$veryfy_result的结果不是true，与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
			//mysign与sign不等，与安全校验码、请求时的参数格式（如：带自定义参数等）、编码格式有关
			//echo  $mysign.'<br/>'.$sign;
			
		
			if ($mysign == $sign) {
				return true;
			} else {
				return false;
			}


				
			//*/

		}



		// 日志消息,把支付宝返回的参数记录下来
		function  log_result($word) {
			$fp = fopen("log.txt","a");
			flock($fp, LOCK_EX) ;
			fwrite($fp,"执行日期：".strftime("%Y%m%d%H%M%S",time())."\n".$word."\n");
			flock($fp, LOCK_UN);
			fclose($fp);
		}


		/**获取远程服务器ATN结果
		 *$url 指定URL路径地址
		 *return 服务器ATN结果集
		 */
		/*
		 function get_verify($url,$time_out = "60") {
			$urlarr     = parse_url($url);
			$errno      = "";
			$errstr     = "";
			$transports = "";
			if($urlarr["scheme"] == "https") {
			$transports = "ssl://";
			$urlarr["port"] = "443";
			} else {
			$transports = "tcp://";
			$urlarr["port"] = "80";
			}
			$fp=@fsockopen($transports . $urlarr['host'],$urlarr['port'],$errno,$errstr,$time_out);
			if(!$fp) {
			die("ERROR: $errno - $errstr<br />\n");
			} else {
			fputs($fp, "POST ".$urlarr["path"]." HTTP/1.1\r\n");
			fputs($fp, "Host: ".$urlarr["host"]."\r\n");
			fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
			fputs($fp, "Content-length: ".strlen($urlarr["query"])."\r\n");
			fputs($fp, "Connection: close\r\n\r\n");
			fputs($fp, $urlarr["query"] . "\r\n\r\n");
			while(!feof($fp)) {
			$info[]=@fgets($fp, 1024);
			}
			fclose($fp);
			$info = implode(",",$info);
			return $info;
			}
			}

			//*/

		//类结束
	}
}
?>